﻿Imports WiremetModel.Entities.OEM
Imports WiremetModel.Entities



Public Class FakturaReportService


    Public Function GenerateReport(ByVal wysylka As Wysylka) As FakturaReport

        Dim reportLanguagePickerDialog As New LanguagePickerDialog("Wersja językowa raportu:", GetInitialLanguage(wysylka))
        If reportLanguagePickerDialog.ShowDialog() <> DialogResult.Yes Then
            Return Nothing
        End If
        Dim reportLanguage As String = reportLanguagePickerDialog.SelectedLanguage

        Dim gatunekLanguagePickerDialog As New LanguagePickerDialog("Wersja językowa gatunku:", reportLanguage)
        If gatunekLanguagePickerDialog.ShowDialog() <> DialogResult.Yes Then
            Return Nothing
        End If
        Dim gatunekLanguage As String = gatunekLanguagePickerDialog.SelectedLanguage



        Dim drutWyslanyPozycjiZleceniaDictionary As New Dictionary(Of Integer, IList(Of Tracking.Drut))
        Dim listaWyslanychDrutow As IList(Of Tracking.Drut) = wysylka.PaczkiWysylki.SelectMany(Function(x) x.Druty).Select(Function(x) x.Drut).ToList()
        Dim pakowanieList As New List(Of Tuple(Of OEM.Pakowanie, Boolean))
        Dim wyslanePozycjeZleceniaSet As New HashSet(Of Tracking.PozycjaZlecenia)()


        For Each drut As Tracking.Drut In listaWyslanychDrutow

            If Not drutWyslanyPozycjiZleceniaDictionary.ContainsKey(drut.PozycjaSchematu.Schemat.PozycjaZlecenia.Id) Then
                drutWyslanyPozycjiZleceniaDictionary.Add(drut.PozycjaSchematu.Schemat.PozycjaZlecenia.Id, New List(Of Tracking.Drut))
                wyslanePozycjeZleceniaSet.Add(drut.PozycjaSchematu.Schemat.PozycjaZlecenia)
            End If
            drutWyslanyPozycjiZleceniaDictionary(drut.PozycjaSchematu.Schemat.PozycjaZlecenia.Id).Add(drut)
            pakowanieList.Add(New Tuple(Of OEM.Pakowanie, Boolean)(drut.Kontrola.First().Pakowanie, drut.PozycjaSchematu.Schemat.PozycjaZlecenia.PozycjaZleceniaOEM.CenaOpakowania))
        Next


        Dim fakturaReportData As IList(Of FakturaReportDataRow) = New List(Of FakturaReportDataRow)
        For Each pozycjaZleceniaTracking As Tracking.PozycjaZlecenia In wyslanePozycjeZleceniaSet

            Dim pozycjaZleceniaOEM As PozycjaZlecenia = pozycjaZleceniaTracking.PozycjaZleceniaOEM
            Dim drutWyslanyPozycjiZlecenia As IList(Of Tracking.Drut) = drutWyslanyPozycjiZleceniaDictionary(pozycjaZleceniaTracking.Id)

            'Dim wagaPozycjiZlecenia As Decimal = CDec(drutWyslanyPozycjiZlecenia.SelectMany(Function(x) x.Rodzice).Sum(Function(x) x.Waga))
            Dim wagaPozycjiZlecenia As Decimal = CDec(drutWyslanyPozycjiZlecenia.Select(Function(x) x.Kontrola.First()).Sum(Function(x) x.Ilosc))

            Dim fakturaReportDataRow As FakturaReportDataRow = New FakturaReportDataRow()
            With fakturaReportDataRow
                .Waga = Math.Round(wagaPozycjiZlecenia, 2)
                .LiczbaSzpul = CShort(drutWyslanyPozycjiZlecenia.Count)
                .CenaDrutuNetto = Math.Round(CDec(pozycjaZleceniaOEM.Cena * .Waga), 2)
                .DrutVAT = If(pozycjaZleceniaOEM.Waluta.Nazwa = "euro", 0, pozycjaZleceniaOEM.Gatunek.VAT)
                .CenaDrutuBrutto = Math.Round(.CenaDrutuNetto + .CenaDrutuNetto * .DrutVAT, 2)
                .Jednostka = pozycjaZleceniaOEM.JednostkaMiary.Jednostka
                .Material = GatunekToString(gatunekLanguage, pozycjaZleceniaOEM.Gatunek)
                .NumerPozycji = pozycjaZleceniaOEM.NumerPozycji.ToString()
                .Waluta = pozycjaZleceniaOEM.Waluta.Nazwa
                .Wymiar = pozycjaZleceniaOEM.Wymiar
                .CenaJednostkowa = CDec(pozycjaZleceniaOEM.Cena)
            End With

            fakturaReportData.Add(fakturaReportDataRow)
        Next


        Dim pakowanieSubreportData As Dictionary(Of Integer, PakowanieSubreportDataRow) = New Dictionary(Of Integer, PakowanieSubreportDataRow)()
        For Each pakowanie As Tuple(Of OEM.Pakowanie, Boolean) In pakowanieList

            If Not pakowanieSubreportData.ContainsKey(pakowanie.Item1.Id) Then
                Dim pakowanieRow As PakowanieSubreportDataRow = New PakowanieSubreportDataRow()
                With pakowanieRow
                    .Numer = pakowanie.Item1.Id
                    .Nazwa = pakowanie.Item1.Nazwa
                    .Ilosc = 0
                    .Waga = 0
                    .CenaZaSztuke = CDec(pakowanie.Item1.Cena)
                    .VAT = My.Settings.OpakowanieVAT
                    .CenaNetto = 0
                    .ZwolnioneZOplatyZaOpakowanie = 0
                End With
                pakowanieSubreportData.Add(pakowanieRow.Numer, pakowanieRow)
            End If

            With pakowanieSubreportData(pakowanie.Item1.Id)
                .Ilosc += 1
                .Waga += CDec(pakowanie.Item1.Waga)
                .CenaNetto += CDec(IIf(pakowanie.Item2, pakowanie.Item1.Cena, 0))
                .ZwolnioneZOplatyZaOpakowanie += CShort(If(pakowanie.Item2, 0, 1))
            End With
        Next

        Dim faktura As FakturaReport = New FakturaReport()

        faktura.SetDataSource(fakturaReportData.OrderBy(Function(x) x.Wymiar))
        faktura.OpenSubreport("PakowanieSubreport").SetDataSource(pakowanieSubreportData.Values.OrderBy(Function(x) x.Nazwa))
        faktura.SetParameterValue("p_report_language", reportLanguage, "PakowanieSubreport")

        faktura.SetParameterValue("p_zlecenie_numer", wysylka.Zlecenie.Numer)
        faktura.SetParameterValue("p_zlecenie_uwagi", wysylka.Zlecenie.Uwagi)

        faktura.SetParameterValue("p_klient_nazwa_pelna", wysylka.Zlecenie.Klient.NazwaPelna)
        faktura.SetParameterValue("p_adres_wysylki_kraj", wysylka.Zlecenie.AdresWysylki.Kraj)
        faktura.SetParameterValue("p_adres_wysylki_kod_pocztowy", wysylka.Zlecenie.AdresWysylki.KodPocztowy)
        faktura.SetParameterValue("p_adres_wysylki_miejscowosc", wysylka.Zlecenie.AdresWysylki.Miejscowosc)
        faktura.SetParameterValue("p_adres_wysylki_ulica", wysylka.Zlecenie.AdresWysylki.Ulica)
        faktura.SetParameterValue("p_adres_wysylki_numer", wysylka.Zlecenie.AdresWysylki.Numer)
        faktura.SetParameterValue("p_adres_wysylki_telefon", wysylka.Zlecenie.AdresWysylki.Telefon)
        faktura.SetParameterValue("p_adres_wysylki_email", wysylka.Zlecenie.AdresWysylki.Email)
        faktura.SetParameterValue("p_sposob_platnosci", wysylka.Zlecenie.Klient.TerminPlatnosci.Trim())
        faktura.SetParameterValue("p_faktura_ilosc_opakowan", wysylka.PaczkiWysylki.Count)
        faktura.SetParameterValue("p_sposob_wysylki", wysylka.Zlecenie.Klient.Wysylka.Trim())
        faktura.SetParameterValue("p_report_language", reportLanguage)

        Return faktura

    End Function


    Private Function GetInitialLanguage(wysylka As Wysylka) As String
        Select Case wysylka.Zlecenie.Klient.Kraj.Trim().ToLower()
            Case "polska"
                Return "polski"
            Case "niemcy"
                Return "niemiecki"
            Case Else
                Return "angielski"
        End Select
    End Function


    Private Function GatunekToString(jezyk As String, gatunek As Gatunek) As String
        Select Case jezyk
            Case "polski"
                Return gatunek.Nazwa
            Case "niemiecki"
                Return gatunek.NazwaNiem
            Case Else
                Return gatunek.NazwaAng
        End Select

    End Function

End Class
